package com.qicheng.wlhyspider.common;

import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.UUID;

/**
 * 登录工具类
 */
@Slf4j
public class LoginUtils {

    public static final String USERNAME = "4600000015";
    public static final String PASSWORD = "1141A68DCC9D49AC4F5429D8FE9C0C36";

    /**
     * 登录并且返回token
     *
     * @return
     */
    public static String login(RedisUtils redisUtils) {
        String uuid = UUID.randomUUID().toString();
        String kaptcha = kaptcha(uuid);
        while (kaptcha == null || kaptcha.length() != 4) {
            kaptcha = kaptcha(uuid);
        }
        HttpResponse httpResponse = HttpUtil.createPost("http://wlhy.mot.gov.cn/hainan/login")
                .body(String.format("username=%s&password=%s&code=%s&uuid=%s", USERNAME, PASSWORD, kaptcha, uuid))
                .execute();
        log.info(httpResponse.body());
        String token = httpResponse.header("x-auth-token");
        if (StringUtils.isBlank(token)){
            token = login(redisUtils);
        }
//        Constants.TOKEN = token;
        redisUtils.set( Constants.TOKEN,token);
        return token;
    }

    /**
     * 返回验证码
     *
     * @param uuid
     * @return
     */
    public static String kaptcha(String uuid) {
        String localPath = "d://yzm.png";
        InputStream inputStream = null;
        FileOutputStream outputStream = null;
        try {
            // 首先，使用Java的URL类和URLConnection类，建立一个连接，连接到远程服务器上的文件。
            URL url = new URL("http://wlhy.mot.gov.cn/hainan/defaultKaptcha?uuid=" + uuid);
            URLConnection connection = url.openConnection();
            // 其次，使用Java的InputStream类，从连接中读取输入流，读取远程服务器上的文件内容。
            inputStream = connection.getInputStream();
            // 然后，使用Java的FileOutputStream类，将读取到的输入流写入到本地文件系统中。
            outputStream = new FileOutputStream(localPath);
            // 最后，使用Java的IOUtils类，将输入流写入到输出流中，实现将远程服务器文件下载到本地文件系统。
            IOUtils.copy(inputStream, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(outputStream);
            IOUtils.closeQuietly(inputStream);
        }

        String base64 = getImgFileToBase642(localPath);
        String text = null;
        try {
            text = OCRUtil.execute("data:image/png;base64," + base64);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return text;
    }

    /**
     * 本地图片转base64
     */
    public static String getImgFileToBase642(String imgFile) {
        //将图片文件转化为字节数组字符串，并对其进行Base64编码处理
        byte[] buffer = null;
        //读取图片字节数组
        try (InputStream inputStream = new FileInputStream(imgFile);) {
            int count = 0;
            while (count == 0) {
                count = inputStream.available();
            }
            buffer = new byte[count];
            inputStream.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 对字节数组Base64编码
        java.util.Base64.Encoder encode = java.util.Base64.getEncoder();
        return encode.encodeToString(buffer);
    }
}
